[JAVA] 객체지향 4대 특징

업데이트:



이번 포스팅은 객체지향 한방에 정리하기이다. 학교다니면서도 공부를 했고 평소에도 면접준비하면서 공부를 했지만 여전히 헷갈리고 모르는 개념이 있기 때문에 내가 모르는 부분을 중심으로 객체지향을 쭉 정리해보려고 한다.

23.06.13 필요한 내용을 좀더 추가했다!





✅ 객체지향 프로그래밍이란?

객체지향 프로그래밍(Object-Oriented Programming)이란 컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나 여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미한다.





✅ 객체지향 프로그래밍의 장점

객체 지향적 설계는 많은 이점이 있는데, 가장 큰 장점중 하나는 프로그램을 보다 유연하고 변경이 용이하게 만들수 있다는 점이다. 마치 컴퓨터 부품을 갈아 끼울 때, 해당 부품만 교체하고 나머지 부품은 건드리지 않아도 되는 것처럼 소프트웨어 설계시 객체지향적 원리를 잘 적용해두면 각각의 부품들이 독립적인 역할을 지니기 때문에 코드의 변경을 최소화하고 유지보수하는데 유리하다.

코드의 재사용을 통해 반복적인 코드를 최소화하고, 코드를 최대한 간결하게 표현 할 수 있다.

접근제어자와 메서드를 이용해 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다. 이를 통해 신뢰성이 높은 프로그래밍을 가능하게 한다.

간단하게 정리하면 “코드의 재사용성이 높고 유지보수가 용이하며, 중복된 코드의 제거가 가능하다” 이러한 장점은 객체지향의 4대 특징에서 비롯되는데 그 특징들에 대해 알아보자.





✅ 객체지향 4대 특징

📌 추상화

비슷한 역할을 하는 attribute나 method를 묶어서 하나의 모델로 만들어 내는 것. 한마디로 공통성과 본질을 모아 추출하는 모델링을 의미한다. 다형성, 상속 모두 추상화에 속한다.


위의 예시를 보면 자동차와 오토바이는 모두 이동수단이고, 이동수단은 출발, 전진과 후진을 할 수 있다는 공통점을 가진다. 이를 객체지향적 사고를 통해 표현하면 자동차와 오토바이라는 하위클래스들의 공통적인 메소드를 추출하여 이동수단이라는 상위클래스에 정의한 것이다.

이를 코드로 표현하면 다음과 같다. 참고로 자바에서 추상화를 구현할 수 있는 문법 요소로는 추상클래스인터페이스가 있는데, 이번 예제에서는 인터페이스를 사용해보겠다.



public interface Vehicle {
	public abstract void start();    // 추상메소드
	void moveForward();              // public abstract 키워드 생략 가능
	void moveBackward();
}

가장 먼저 자동차와 오토바이의 공통적인 기능인 출발, 전진, 후진 기능을 추출해서 이동수단 인터페이스에 정의한다.



public class Car implements Vehicle {
	@Override
	public void moveForward(){
		System.out.println("자동차 전진");
	}

	@Override
	public void moveBackward(){
		System.out.println("자동차 후진");
	}
}
public class MotorBike implements Vehicle {
	@Override
	public void moveForward(){
		System.out.println("오토바이 전진");
	}

	@Override
	public void moveBackward(){
		System.out.println("오토바이 후진");
	}
}

위의 코드를 보면 인터페이스 Vehicle에서 선언한 moveForward()moveBackward() 를 각각의 클래스의 맥락에 맞게 구현한 것을 볼 수 있다. 자동차와 오토바이 모두 전진,후진의 기능을 공통적으로 가지기때문에 이동수단의 메소드를 가져와 사용하지만, 자동차 클래스는 자동차를 전진시켜야하고 오토바이 클래스는 오토바이를 전진시켜야 하기때문에 각 클래스마다 필요한 기능으로 달리 구현했다.

이런 일련의 과정을 역할과 구현의 분리라고 표현하고, 객체지향의 특징인 추상화 이다.




📌 상속

상위 클래스의 메소드, 변수등의 특징을 하위 클래스가 물려받는 것을 의미한다.

앞서 살펴본 추상화의 연장선에서, 상속은 클래스 간 공유 될 수 있는 속성과 기능들을 상위클래스로 추상화시켜 상위클래스로부터 확장된 여러개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다.

이를 통해 속성과 기능을 재사용할 수 있고 반복적인 코드를 최소화할 수 있다. JAVA에서는 extends 를 사용해 상속을 지원한다. 또한 하나의 클래스는 한번의 상속만 가능하다. (= 하나의 상위클래스만 가질 수 있다)


📌 다형성

다형성이란 어떤 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질을 의미한다.

비유적으로 표현하면 어떤 중년의 남성이 있다고 했을 때 그 남자의 역할이 아내에게는 남편, 자식에게는 아버지, 부모님에게는 자식, 회사에서는 회사원, 동아리에서는 리더 등 상황과 환경에 따라서 달라지는 것과 비슷하다.


객체지향에서의 다형성도 이와 비슷한데, 어떤 객체의 속성이나 기능이 맥락에 따라 다른역할을 수행할 수 있는 객체지향의 특성을 의미한다. 대표적인 예로는 메서드 오버라이딩(Override)과 오버로딩(Overload)이 있다.



Vehicle 인터페이스

public interface Vehicle {
	public abstract void start();
	void moveForward();
	void moveBackward();
}


Car 클래스

public class Car implements Vehicle {
	@Override
	public void moveForward(){
		System.out.println("자동차가 앞으로 전진합니다");
	}

	@Override
	public void moveBackward(){
		System.out.println("자동차가 뒤로 후진합니다");
	}
}

오버라이딩을 사용하면 같은 이름의 moveForward()moveBackward()를 각각의 클래스의 맥락에 맞게 재정의해서 사용할 수 있다. 즉, 같은 이름의 메소드가 상황에 따라 다른 역할을 수행하는 것이다. 또한 하나의 클래스 내에서 같은 이름의 메서드를 여러개 중복하여 정의하는 메서드 오버로딩 역시 같은 맥락이다.

둘다 다형성을 사용하는 개념이고 같은 이름의 다른 함수를 호출한다는 공통점이 있다.

  • 오버로딩(Overloading) : 함수의 이름은 같지만 매개변수의 타입이나 갯수가 다른 메소드를 만드는 것을 의미한다. return 타입은 동일하거나 다를 수 있지만, return 타입만 다를 수는 없다.

  • 오버라이딩(Overriding) : 상위클래스나 인터페이스에 있는 메소드를 재정의 하는 것을 의미한다.




📌 캡슐화(정보은닉)

특정 객체가 독립적으로 역할을 수행하기 위해 필요한 데이터와 기능을 하나로 묶은것. 한마디로 모듈화를 의미한다. 정보를 객체 안에 포함시키고, 정보에 대한 직접적인 접근은 허용하지 않으며, 접근제어자를 통해 정보의 공개정도를 조절할 수 있다.

자바의 캡슐화는 외부로부터 클래스에 정의된 속성과 기능들을 보호하고, 필요한 부분만 외부로 노출 될 수 있도록 하여 각 객체 고유의 독립성과 책임 영역을 안전하게 지키고자 하는 목적이 있다.

이러한 캡슐화는 크게 두가지 방법으로 자바에서 구현될 수 있다. 첫번째로는 접근제어자를 활용하는 것이다. 접근제어자는 클래스나 클래스 멤버들에 사용되어 해당 클래스나 멤버들을 외부에서 접근하지 못하도록 접근을 제한하는 역할을 한다.


  • Public : 접근 제한이 전혀 없다

  • Protected : 상속클래스 및 같은 패키지에서만 사용 가능

  • Default : 같은 패키지 내에서 사용 가능

  • Private : 정의된 클래스 내부에서만 사용 가능. Getter,Setter를 이용해 정보 접근 or 수정


접근제어자 같은 클래스 같은 패키지 하위클래스 전체
public o o o o
protected o o o x
default o o x x
private o x x x





객체지향의 4대 특징은 굉장히 중요하다. 4가지 특징의 의미를 달달 외울게 아니라 그 특징을 실제 코드에 잘 녹여내리는 것이 중요하다. 코드를 짤 때 이 4가지 특징을 잘 이해하고 적용시키면 훨씬 효율적인 코드가 될 수 있음을 명심하자.

댓글남기기